import java.util.*;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[][] nums = new int[][]{{1,0}};
        for(int e: s.findOrder(2, nums)) {
            System.out.println(e);
        }
    }

    public int[] findOrder(int n, int[][] p) {
        /**
         * */
        // 1 预处理
        // -创建入度表
        int[] inEdges = new int[n];
        // -建图
        Map<Integer, List<Integer>> edges = new HashMap<>();
        for(int[] e: p) {
            int a = e[0];
            int b = e[1];
            // -记录对应关系
            if(!edges.containsKey(b)) {
                edges.put(b, new ArrayList<>());
            }
            edges.get(b).add(a);
            // -记录入度
            inEdges[a] ++;
        }
        // -创建返回数组
        List<Integer> ret = new ArrayList<>();

        // 2 BFS
        // -创建队列并初始化（将所有入度为0的课程入队）
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0; i < n; i++) {
            if(inEdges[i] == 0) {
                queue.add(i);
            }
        }
        // -正式宽搜
        while(!queue.isEmpty()) {
            // -1 出队并记录至序列中
            int cur = queue.poll();
            ret.add(cur);
            // -2 消除出队元素的边与其对应的入度
            for(int e: edges.getOrDefault(cur, new ArrayList<>())) {
                inEdges[e] --;
                if(inEdges[e] == 0) {
                    // -3 找到入度为0的元素，重新入队
                    queue.offer(e);
                }
            }
        }

        // 3 判断是否可行（图中是否有环）
        for(int e: inEdges) {
            if(e != 0) {
                return new int[]{};
            }
        }

        // 4 返回值
        int[] array = new int[ret.size()];
        for(int i = 0; i < ret.size(); i++) {
            array[i] = ret.get(i);
        }
        return array;
    }
}
